#include <bits/stdc++.h>

using namespace std;

class Solution
{
public:
    // s.leng <= 1e5
    /// @brief
    /// @param base
    /// @param exp must be positive
    /// @param mod
    /// @return
    // long long pow(long long base, int exp, long long mod = INT64_MAX)
    // {
    //     long long res = 1;
    //     for (; exp; exp /= 2)
    //     {
    //         if (exp % 2)
    //             res = res * base % mod;
    //         base = base * base % mod;
    //     }
    //     return res;
    // }

    bool hasOnlyOneUniqueChar(const std::string &s)
    {
        if (s.empty())
        {
            return true; // 空字符串视为只有一种字符
        }
        char firstChar = s[0];
        int m = min((int)s.size(), 1000);
        for (int i = 0; i < m; ++i)
        {
            char c = s[i];
            if (c != firstChar)
            {
                return false;
            }
        }
        return true;
    }

public:
    bool hasSameDigits(string s)
    {
        // 对 s.leng 及以下进行枚举
        if (hasOnlyOneUniqueChar(s))
        {
            return true;
        }
        int length = s.size();

        int INF = 0x3f3f3f3f;

        int MOD = 5;
        //         int MX = length + 1;

        //         vector<int> fac(MX, 0); // fac[i] = i!

        //         fac[0] = 1;

        //         for (int i = 1; i < MX; ++i)
        //         {
        //             fac[i] = fac[i - 1] * (long long)i % MOD;
        //         }

        //         vector<int> inv_f(MX, 0);
        //         inv_f[MX - 1] = pow(fac[MX - 1], MOD - 2, MOD);
        //         for (int i = MX - 1; i > 0; --i)
        //         {
        //             inv_f[i - 1] = inv_f[i] * (long long)i % MOD;
        //         }

        auto combiMod5 = [&](int n, int m)
        {
            if (n < m || m < 0 || n < 0)
            {
                return 0;
            }
            // return (fac[n] * inv_f[m] % MOD) *
            //        inv_f[n - m] % MOD;
            int res = 1;
            vector<vector<int>> table(
                {{1},
                 {1, 1},
                 {1, 2, 1},
                 {1, 3, 3, 1},
                 {1, 4, 6, 4, 1}});
            while (n > 0 && m > 0)
            {
                int n_i = n % 5;
                int m_i = m % 5;
                if (m_i > n_i)
                {
                    return 0;
                }
                res = (res * table[n_i][m_i]) % 5;
                n /= 5;
                m /= 5;
            }
            return res;
        };

        // auto permu = [&](int n, int m)
        // {
        //     if (n < m || m < 0 || n < 0)
        //     {
        //         return 0;
        //     }
        //     return (fac[n] * inv_f[n - m] % MOD);
        // };

        auto combiMod2 = [&](int n, int m)
        {
            if (n < m || m < 0 || n < 0)
            {
                return 0;
            }
            while (n > 0 && m > 0)
            {
                if ((n & 1) < (m & 1))
                {
                    return 0;
                }
                n >>= 1;
                m >>= 1;
            }
            return 1;
        };
        auto combi = [&](int n, int m)
        {
            int com5 = combiMod5(n, m);
            int com2 = combiMod2(n, m);
            return com5 + (((com5 & 1) == com2) ? 0 : 5);
        };

        int di = length - 2;
        int sum1 = 0;
        int sum2 = 0;
        // cout << di << endl;
        for (int i = 0; i <= di; ++i)
        {
            // cout << combi(di, i) << " ";
            int c = combi(di, i);
            sum1 = (sum1 + (s[i] - '0') * c) % 10;
            sum2 = (sum2 + (s[i + 1] - '0') * c) % 10;
        }
        // cout << endl;
        // cout << sum1 << " " << sum2 << endl;
        return sum1 == sum2;
    }
};

int main()
{

    // system("pause");
    return 0;
}
